<?php
/*****************************************抽象工厂***********************************************************************/
/**
 * Class option
 * 简单工厂模式是由一个工厂类根据参数来决定创立出哪一种产品类的实例。
 * 工厂方法模式通过调用不同的方法返回需要的类，而不是去实例化具体的类。 
 * 对实例创建进行了包装。 工厂方法是一组方法， 他们针对不同条件返回不同的类实例，这些类一般有共同的父类。
 * 工厂方法模式实施一种按需分配的策略， 即传入参数进行选择， 工厂方法根据参数进行选择，返回具体的实例。

 * 一、抽象工厂的定义
 *  提供一个创建一系列相关或相互依赖对象的接口，而无须指定它们的具体类。
 *  二、实现思路
 *   实现思路：如果说简单工厂与工厂方法是对同一个问题的两种不同的解决方法的话，抽象工厂就是解决一系列这种问题的方法。
 * 因为其主要的作用就是生产一系列相互依赖的对象，而不用去关心它们具体的实现。
 *  无标题
 */
//相关运算的抽象方法
abstract class option{
    public $num1;
    public $num2;

    public function set($num1,$num2){
        $this->num1=$num1;
        $this->num2=$num2;
    }

    public abstract function getResult();
}

//加法1
class AddChnia extends option{
    public function getResult()
    {
        return $this->num1+$this->num2;
        // TODO: Implement getResult() method.
    }
}

//减法1
class SubChina extends option{
    public function getResult()
    {
        return $this->num1-$this->num2;
        // TODO: Implement getResult() method.
    }
}

//加法2
class AddAmcia extends option{
    public function getResult()
    {
        return $this->num1+$this->num2+10;
        // TODO: Implement getResult() method.
    }
}

//减法2
class SubAmcia extends option{
    public function getResult()
    {
        return ($this->num1-$this->num2)-10;
    }
}

//创造 方法对象 工厂类
abstract class Factory{

    public static function GetInstance($className){
        if(class_exists($className)){
            return new $className();
        }else{
            return "方法不存在";
        }
    }
    public abstract function Add();
    public abstract function Sub();
}

//工厂1
class China extends Factory{
    public function Add()
    {
        return new AddChnia();
        // TODO: Implement Add() method.
    }
    public function Sub()
    {
        return new SubChina();
        // TODO: Implement Sub() method.
    }
}

//工厂2
class Amcia extends Factory{
    public function Add()
    {
        return new AddAmcia();
        // TODO: Implement Add() method.
    }

    public function Sub()
    {
        return new SubAmcia();
        // TODO: Implement Sub() method.
    }
}

$china=Factory::GetInstance("China");
$method=$china->Add();
$method->set(10,3);
echo $method->getResult();




